wayland: Look for cursor themes in $HOME
authorMatthias Clasen <mclasen@redhat.com>
Tue, 29 Jun 2021 20:57:15 +0000 (16:57 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Tue, 29 Jun 2021 20:57:15 +0000 (16:57 -0400)
We should look in the same places that libXcursor does,
so add $XDG_DATA_HOME/icons and $HOME/.icons to the list.

Fixes: #4080
gdk/wayland/gdkdisplay-wayland.c

index 4caae38066c9fc0900a80a20a2807b38a385826b..c27b165594fe7dafc1deebcf40dd8010c07b328a 100644 (file)
@@ -991,6 +991,26 @@ gdk_wayland_display_get_toplevel_surfaces (GdkDisplay *display)
   return GDK_WAYLAND_DISPLAY (display)->toplevels;
 }
 
+static struct wl_cursor_theme *
+try_load_theme (GdkWaylandDisplay *display_wayland,
+                const char        *dir,
+                gboolean           dotdir,
+                const char        *name,
+                int                size)
+{
+  struct wl_cursor_theme *theme = NULL;
+  char *path;
+
+  path = g_build_filename (dir, dotdir ? ".icons" : "icons", name, "cursors", NULL);
+
+  if (g_file_test (path, G_FILE_TEST_IS_DIR))
+    theme = wl_cursor_theme_create (path, size, display_wayland->shm);
+
+  g_free (path);
+
+  return theme;
+}
+
 static struct wl_cursor_theme *
 get_cursor_theme (GdkWaylandDisplay *display_wayland,
                   const char *name,
@@ -1000,16 +1020,18 @@ get_cursor_theme (GdkWaylandDisplay *display_wayland,
   struct wl_cursor_theme *theme = NULL;
   int i;
 
+  theme = try_load_theme (display_wayland, g_get_user_data_dir (), FALSE, name, size);
+  if (theme)
+    return theme;
+
+  theme = try_load_theme (display_wayland, g_get_home_dir (), TRUE, name, size);
+  if (theme)
+    return theme;
+
   xdg_data_dirs = g_get_system_data_dirs ();
   for (i = 0; xdg_data_dirs[i]; i++)
     {
-      char *path = g_build_filename (xdg_data_dirs[i], "icons", name, "cursors", NULL);
-
-      if (g_file_test (path, G_FILE_TEST_IS_DIR))
-        theme = wl_cursor_theme_create (path, size, display_wayland->shm);
-
-      g_free (path);
-
+      theme = try_load_theme (display_wayland, xdg_data_dirs[i], FALSE, name, size);
       if (theme)
         return theme;
     }